#include <iostream>
#include <unistd.h>
#include <pthread.h>
// #define NUM 10

// // 新线程
// void *run(void *args)
// {
//     while(true)
//     {
//         std::cout << "new thread, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     std::cout << "我是一个进程: " << getpid() << std::endl;
//     // 创建多线程
//     for(int i = 0; i < NUM; i++)
//     {
//         pthread_t id;
//         pthread_create(&id, nullptr, run, nullptr);
//     }

//     // 主线程
//     while(true)
//     {
//         std::cout << "main thread, pid: "<< getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }

// int *addr = nullptr;

// void *start1(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     int a = 100;
//     addr = &a;
//     while (true)
//     {
//         std::cout << name << " start1 local val a: " << a << std::endl;
//         sleep(1);
//     }
// }

// void *start2(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     while (true)
//     {
//         if(addr != nullptr)
//         std::cout << name << " start2 mod val a: " << (*addr)++ << std::endl;
//         sleep(1);
//         // break;
//     }
// }

// int main()
// {
//     pthread_t tid1, tid2;
//     pthread_create(&tid1, nullptr, start1, (void *)"thread-1");
//     pthread_create(&tid2, nullptr, start2, (void *)"thread-2");

//     sleep(10);

//     return 0;
// }

// void *start1(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     int a = 100;
//     while (true)
//     {
//         std::cout << name << " start1 local val a: " << a << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid1, tid2;
//     pthread_create(&tid1, nullptr, start1, (void *)"thread-1");

//     sleep(2);

//     pthread_cancel(tid1);

//     sleep(2);

//     void *ret = nullptr;
//     int n = pthread_join(tid1, &ret);
//     std::cout << "n: " << n << " ret: "<< (long long int)ret << std::endl;

//     return 0;
// }

// 线程的局部存储
// __thread只能修饰内置类型
__thread int shared_value = 100;

std::string toHex(pthread_t tid)
{
    // 4. 进程内的函数，线程共享
    char buffer[64];
    snprintf(buffer, sizeof(buffer), "0x%lx", tid);
    return buffer;
}

void *start(void *args)
{
    std::string name = static_cast<const char *>(args);
    sleep(1);
    while (true)
    {
        printf("new thread, shared_value: %d,  &shared_value: %p\n", shared_value, &shared_value);
        sleep(1);
    }

    return nullptr;
}

int main()
{
    pthread_attr_t attr;

    
    pthread_t tid;
    pthread_create(&tid, nullptr, start, (void *)"thread-1");
    std::cout << "main thread id, " << toHex(pthread_self())
              << ", new thread id: " << toHex(tid) << std::endl;

    while (true)
    {
        printf("main thread, shared_value: %d,  &shared_value: %p\n", shared_value, &shared_value);
        shared_value += 10;
        sleep(1);
    }
    pthread_join(tid, nullptr);
    return 0;
}

